package cn.sc.summer.domain.service;

import io.minio.ObjectStat;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 类名：minio信息加载接口
 *
 * @author a-xin
 * @date 2024/1/29 09:20
 */
public interface MinioService {

    /**
     * 初始化minio
     */
    void initMinio();

    /**
     * 上传文件
     *
     * @param uploadFile 文件流
     * @return 文件地址
     */
    String uploadFile(MultipartFile uploadFile);

    /**
     * 下载文件
     *
     * @param fileId   文件地址
     * @param response 返回数据信息
     */
    void downloadFile(String fileId, HttpServletResponse response);

    /**
     * 检查存储桶是否存在
     */
    boolean bucketExists() throws Exception;

    /**
     * 创建桶
     */
    void createBucket(String bucketName) throws Exception;

    /**
     * 通过InputStream上传对象
     *
     * @param objectName 存储桶里的对象名称
     * @param stream     要上传的流 (文件的流)
     */
    void putObject(String objectName, InputStream stream) throws Exception;

    /**
     * 删除一个对象
     *
     * @param objectName 存储桶里的对象名称
     */
    void removeObject(String objectName) throws Exception;

    /**
     * 删除指定桶的多个文件对象,返回删除错误的对象列表，全部删除成功，返回空列表
     *
     * @param objectNames 含有要删除的多个object名称的迭代器对象
     */
    List<String> removeObject(List<String> objectNames) throws Exception;

    /**
     * 获取对象的元数据
     *
     * @param objectName 存储桶里的对象名称
     */
    ObjectStat statObject(String objectName) throws Exception;

    /**
     * 文件访问路径
     *
     * @param objectName 存储桶里的对象名称
     */
    String getObjectUrl(String objectName) throws Exception;

    /**
     * 下载文件
     *
     * @param filename 文件名
     * @param response 输出文件
     */
    void getObject(String filename, HttpServletResponse response) throws IOException;
}
